package mutexs

import "sync"

// 一种锁.可以锁住资源后调用callback.调用完成后解锁.
type Locker interface {
	Lock(callback func())
}

// 为什么sync库只有互斥锁,没有读写锁呢?
// 没有可以共享读的锁,这个不太常用.现在遇到的工程中加锁冲突的概率非常小.
// 一旦疏忽在改代码的时候读取过程塞进去了一个写动作就有危险了.而且通常这种危险很难debug
// 再提醒自己一次:cpu高效内存高效都不是经济高效.代码安全简洁才是经济高效
// 测试放弃共享读锁,无脑互斥
// 为什么sync库只有互斥锁,没有读写锁呢?
// 难道这就是答案?
type Mutex struct {
	locker sync.Mutex //不对外开放Lock功能.避免意外死锁
}

// 独占执行callback.这个函数略有性能损失,但是完全规避了忘了开锁的风险.
// 3.4GHz的cpu在1.18下测试每次使用闭包损失4ns性能,相当于12个周期.这个性能可以接受.
// 再提醒自己一次:cpu高效内存高效都不是经济高效.代码安全简洁才是经济高效.改变这种强迫症,你可以的.
// defer可以保证callback中即使panic也不会死锁.
// callback为nil会发生panic
func (mutex *Mutex) Lock(callback func()) {
	mutex.locker.Lock()
	defer mutex.locker.Unlock()
	callback()
}
